<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>支付页面</title>
</head>
<body style="text-align: center;">
<span class="msg">支付中...</span>
<jquery/>
<script>

    if (typeof WeixinJSBridge == "undefined"){
        if( document.addEventListener ){
            document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
        }else if (document.attachEvent){
            document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
            document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
        }
    }else{
        onBridgeReady();
    }

    function onBridgeReady(){
        var data={$data};
        var return_url = '{$return_url}';
        WeixinJSBridge.invoke(
                'getBrandWCPayRequest', data,
                function(res){
                    if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                        // 使用以上方式判断前端返回,微信团队郑重提示：res.err_msg将在用户支付成功后返回    ok，但并不保证它绝对可靠。
                        var params = getUrlPath();
                        ajax({
                            url:'orderquery?out_trade_no='+params['out_trade_no'] + '&open_id=' + params['open_id'],
                            type:'get',
                            success:function (data1) {
                                if(data1.code==1){
                                    window.location.href= return_url;
                                }
                                else{
                                    alert('支付失败！若已扣钱，请截图联系客服查询！');
                                }
                            }
                        });
                    }else{
                        alert('支付失败。'+res.err_desc+res.err_msg); // 显示错误信息
                        window.location.href = return_url;
                    }
                }
        );
    }

    //获取URL参数
    function getUrlPath(){
        var url = location.search;
        var Request = new Object();
        if(url.indexOf("?")!=-1){
            var str = url.substr(1)　//去掉?号
            var strs= str.split("&");
            for(var i=0;i<strs.length;i++){
                Request[strs[i].split("=")[0]]=unescape(strs[ i].split("=")[1]);
            }
        }
        return Request;
    }
    // 原生ajax
    function ajax(opts) {
        // 创建ajax对象
        var xhr = null,
            abortTimeout = null,
            empty =function(){},
            ajax_url = "",
            opts = {
                type : ( opts.type && opts.type.toUpperCase() ) || 'GET',
                url : opts.url || "",
                data : opts.data || "", //query
                dataType : opts.dataType || 'json',
                success : opts.success || empty,
                error : opts.error || empty,
                timeout : opts.timeout || 10000 //默认超时时间：30S ，与产品交互保持一致
            };
        if (window.XMLHttpRequest) {
            xhr = new XMLHttpRequest();
        }
        opts.data = formatParams( opts.data );
        if (opts.type == 'GET') {
            if(opts.url.indexOf("?")>-1){
                if( opts.data =="" ){
                    ajax_url = opts.url;
                } else {
                    ajax_url = opts.url + '&' + opts.data;
                }
            } else {
                ajax_url = opts.url + '?' + opts.data;
            }
            xhr.open('GET', ajax_url , true);
            xhr.send();

        } else if (opts.type == 'POST') {
            xhr.open('POST', opts.url, true);
            // 如果需要像 html 表单那样 POST 数据，请使用 setRequestHeader() 来添加 http 头。
            xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xhr.send( opts.data );
        }

        // 处理返回数据
        xhr.onreadystatechange = function () {
            /*
             ** 每当readyState改变时，就会触发onreadystatechange事件
             ** readyState属性存储有XMLHttpRequest的状态信息
             ** 0 ：请求未初始化
             ** 1 ：服务器连接已建立
             ** 2 ：请求已接受
             ** 3 : 请求处理中
             ** 4 ：请求已完成，且相应就绪
             */
            if (xhr.readyState == 4) {
                var res,error;
                xhr.onreadystatechange = empty;
                clearTimeout( abortTimeout );
                // console.log( "xhr.status: " , xhr.status );
                /*
                 ** Http状态码
                 ** 1xx ：信息展示
                 ** 2xx ：成功
                 ** 3xx ：重定向
                 ** 4xx : 客户端错误
                 ** 5xx ：服务器端错误
                 */
                // var protocol = /^([\w-]+:)\/\//.test(opts.url) ? RegExp.$1 : window.location.protocol;
                // if ( (xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:') ) {
                if ( (xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 ) {
                    res = xhr.responseText; // xhr.responseText 和 xhr.response 结果相同
                    try {
                        // console.info( "snsnav request success" );
                        if( opts.type == 'GET' ){
                            if( opts.dataType == "json" ){
                                res = JSON.parse( xhr.responseText );
                            } else if ( opts.dataType == 'script' ) {
                                // http://perfectionkills.com/global-eval-what-are-the-options/
                                (1,eval)(res);
                            } else if ( opts.dataType == 'xml' ) {
                                res = xhr.responseXML;
                            }
                        }
                        else if( opts.type == 'POST' ){
                            if( opts.dataType == "json" ){
                                res = JSON.parse( xhr.responseText );
                            } else if ( opts.dataType == 'script' ) {
                                (1,eval)(res);
                            } else if ( opts.dataType == 'xml' ) {
                                res = xhr.responseXML;
                            }
                        }
                    } catch (e) {
                        error = e;
                    }
                    if( error ){
                        opts.error( error, '参数错误！' , xhr );
                    } else {
                        opts.success( res );
                    }
                } else {
                    // opts.error( xhr.statusText || 'unknown' , xhr.status ? 'error' : 'abort' , xhr );
                    // xhr.status=0时，相关介绍：http://www.w3.org/TR/XMLHttpRequest/
                    // The status attribute must return the result of running these steps:
                    // 1、If the state is UNSENT or OPENED, return 0.
                    // 2、If the error flag is set, return 0.
                    // 3、Return the HTTP status code.
                    // var xhr_status = xhr.status || 'unknown';

                    switch (xhr.status){
                        case 301:
                            alert('(code:301)永久重定向。');
                            break;
                        case 302:
                            alert('(code:302)临时重定向。');
                            break;
                        case 303:
                            alert('(code:303)请求资源存在另一个URI。');
                            break;
                        case 307:
                            alert('(code:307)临时重定向。');
                            break;
                        case 400:
                            alert('(code:400)报文存在语法错误或参数错误。');
                            break;
                        case 401:
                            alert('(code:401)发送的请求需要有HTTP认证信息或者是认证失败。');
                            break;
                        case 403:
                            alert('(code:403)禁止访问。');
                            break;
                        case 404:
                            alert('(code:404)数据获取/输入失败，没有此服务。');
                            break;
                        case 500:
                            alert('(code:500)服务器故障或Web应用故障。');
                            break;
                        case 503:
                            alert('(code:503)服务器超负载或停机维护。');
                            break;
                        case 504:
                            alert('(code:504)数据获取/输入失败，服务器没有响应。');
                            break;
                        default:
                            opts.error(opts.error('服务器错误状态:'+xhr.status));
                            break;
                    }
                }
            }
        };
        // function ajaxError( error, type, xhr ){ }
        // opts.error( error, 'parsererror',xhr );
        // type: "timeout", "error", "abort", "parsererror"
        if (opts.timeout > 0){ //设置超时时间
            abortTimeout = setTimeout(function(){
                xhr.onreadystatechange = empty;
                //取消当前响应，关闭连接并且结束任何未决的网络活动
                xhr.abort();
                //请求时间 超过前端设置的超时时间
                opts.error('请求超时！','timeout',xhr);
            }, opts.timeout);
        }
        return xhr;
        //参数格式化
        function formatParams(data) {
            var arr = [];
            for (var name in data) {
                arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));
            }
            arr.push(("v=" + Math.random()).replace(".",""));
            return arr.join("&");
        }
    }


</script></body></html>